package Java2Test.mythread.threadsafe2;

/**
 * 使用同步方法和类锁实现线程安全的卖票逻辑
 */
class MyRunnable implements Runnable {
    // 共享资源：总票数
    private int ticket = 0;

    @Override
    public void run() {
        // 循环卖票直到售罄
        while (true) {
            // 调用同步方法检查并处理售票逻辑
            if (extracted()) break;
        }
    }

    /**
     * 同步方法：检查票是否售罄并执行售票操作
     * 注意：此处存在双重同步（方法级+类级），实际只需一种
     * @return 票已售罄返回true，否则返回false
     */
    private synchronized boolean extracted() {
        // 使用类锁保证线程安全（与方法级同步锁等效）
        synchronized (MyRunnable.class) {
            // 检查是否售完所有票
            if (ticket == 100) {
                return true;
            } else {
                try {
                    // 模拟业务处理耗时
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // 恢复中断状态
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }
                // 线程安全的票数递增
                ticket++;
                System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
            }
        }
        return false;
    }
}